package cn.iocoder.yudao.module.system.dal.dataobject.userbehavior;

import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 用户行为统计 DO
 *
 * @author 系统开发团队
 */
@TableName("ai_user_behavior_stats")
@KeySequence("ai_user_behavior_stats_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserBehaviorStatsDO extends BaseDO {

    /**
     * 统计ID
     */
    @TableId
    private Long id;

    /**
     * 统计日期
     */
    private LocalDate statDate;

    /**
     * 统计类型：1-日统计，2-周统计，3-月统计
     */
    private Integer statType;

    // ========== 核心功能使用统计 ==========

    /**
     * 推荐功能使用次数
     */
    private Long recommendationUsage;

    /**
     * 报表功能使用次数
     */
    private Long reportUsage;

    /**
     * 问答功能使用次数
     */
    private Long qaUsage;

    /**
     * 抽奖功能使用次数
     */
    private Long lotteryUsage;

    /**
     * 兑换码功能使用次数
     */
    private Long redemptionUsage;

    /**
     * 任务功能使用次数
     */
    private Long taskUsage;

    // ========== 用户行为路径统计 ==========

    /**
     * 单功能使用用户数
     */
    private Long singleFeatureUsers;

    /**
     * 多功能使用用户数
     */
    private Long multiFeatureUsers;

    /**
     * 深度使用用户数（使用3个以上功能）
     */
    private Long deepUsageUsers;

    /**
     * 平均功能使用数
     */
    private BigDecimal avgFeatureUsage;

    // ========== 转化漏斗统计 ==========

    /**
     * 注册用户数
     */
    private Long registrationUsers;

    /**
     * 首次登录用户数
     */
    private Long firstLoginUsers;

    /**
     * 功能使用用户数
     */
    private Long featureUsageUsers;

    /**
     * 活跃用户数
     */
    private Long activeUsers;

    /**
     * 留存用户数
     */
    private Long retentionUsers;

    /**
     * 注册到首次登录转化率
     */
    private BigDecimal regToLoginRate;

    /**
     * 登录到功能使用转化率
     */
    private BigDecimal loginToUsageRate;

    /**
     * 功能使用到活跃转化率
     */
    private BigDecimal usageToActiveRate;

    /**
     * 活跃到留存转化率
     */
    private BigDecimal activeToRetentionRate;

    // ========== 平均使用统计 ==========

    /**
     * 平均会话时长（分钟）
     */
    private BigDecimal avgSessionDuration;

    /**
     * 平均页面浏览数
     */
    private BigDecimal avgPageViews;

    /**
     * 平均功能使用次数
     */
    private BigDecimal avgFeatureUsageCount;

    /**
     * 平均API调用次数
     */
    private BigDecimal avgApiCalls;

    // ========== 计算状态 ==========

    /**
     * 计算状态：0-待计算，1-计算中，2-计算完成，3-计算失败
     */
    private Integer calculationStatus;

    /**
     * 计算开始时间
     */
    private LocalDateTime calculationStartTime;

    /**
     * 计算结束时间
     */
    private LocalDateTime calculationEndTime;

    /**
     * 计算耗时（秒）
     */
    private Integer calculationDuration;

    /**
     * 错误信息
     */
    private String errorMessage;

    // ========== 常量定义 ==========

    /**
     * 统计类型 - 日统计
     */
    public static final Integer STAT_TYPE_DAILY = 1;

    /**
     * 统计类型 - 周统计
     */
    public static final Integer STAT_TYPE_WEEKLY = 2;

    /**
     * 统计类型 - 月统计
     */
    public static final Integer STAT_TYPE_MONTHLY = 3;

    /**
     * 计算状态 - 待计算
     */
    public static final Integer CALCULATION_STATUS_PENDING = 0;

    /**
     * 计算状态 - 计算中
     */
    public static final Integer CALCULATION_STATUS_CALCULATING = 1;

    /**
     * 计算状态 - 计算完成
     */
    public static final Integer CALCULATION_STATUS_COMPLETED = 2;

    /**
     * 计算状态 - 计算失败
     */
    public static final Integer CALCULATION_STATUS_FAILED = 3;
}